// #pragma once

// #include <iostream>
// #include "Windows/WinSystem.hpp"
// #include <string>
// #include <filesystem>
// #include <future>
// #include <chrono>
// #include <thread>
// #include "Windows/WinProcess.hpp"
// #include "Windows/SharedMemory.hpp"
// #include <TlHelp32.h>
// #include "SharedData.hpp"
// #include "Windows/Dialog.hpp"

// class DeamonProcess : public std::enable_shared_from_this<DeamonProcess>
// {
// private:
//     std::unique_ptr<CppWinApi::Windows::SharedMemory<SharedData>> mSharedMemory;
//     std::string mUUID;

// public:
//     DeamonProcess(const std::string &uuid)
//     {
//         if (uuid.empty())
//             throw std::invalid_argument("Parameter 'id' cannot be empty");
//         mSharedMemory = CppWinApi::Windows::SharedMemory<SharedData>::Create(uuid);
//         mUUID = uuid;

//         // 设置保护进程运行状态
//         mSharedMemory->Set([](SharedData *data)
//                            { 
//                                 data->DaemonProcessIsRunning = true; 
//                                 data->DaemonProcessId = ::GetCurrentProcessId(); });
//     }

//     /// @brief 守护工作进程
//     /// @param workProcessId 工作进程 id
//     std::future<void> ProtectingWorkProcessAsync()
//     {
//         auto workProcessId = mSharedMemory->Get().WorkProcessId;

//         CppWinApi::Windows::Dialog::Show(("workProcessId: " + std::to_string(workProcessId)).c_str());

//         // 获取工作进程的 exe 文件
//         auto exePath = CppWinApi::Windows::WinProcess::GetProcessExePath(workProcessId);
//         auto workDir = exePath.parent_path();

//         // 等待工作进程退出
//         CppWinApi::Windows::WinProcess::WaitProcessExit(workProcessId);

//         auto self = shared_from_this();

//         return std::async(std::launch::async, [self, exePath, workDir]()
//                           {
//         // 只要工作进程退出，则重启工作进程
//         do
//         {
//             // 工作进程退出之后，重新启动工作进程
//             auto pi = CppWinApi::Windows::WinProcess::StartProcess(
//                 exePath.string().c_str(),
//                 0,
//                 "",
//                 workDir.string().c_str());

//             // 如果在StartProcess 和 WaitProcessExit 之间，进程退出了，那么将不再启动工作进程
//             // 更新工作进程的 pid
//             auto workProcessId = pi.GetProcessId();
//             self->mSharedMemory->Set([workProcessId](SharedData* data){data->WorkProcessId = workProcessId;});

//             // 等待工作进程退出
//             CppWinApi::Windows::WinProcess::WaitProcessExit(pi.GetProcessId());

//         } while (true); });
//     }

//     /// @brief 启动守护进程守卫
//     /// @throws std::runtime_error 如果守护进程启动失败
//     ProcessInformation LaunchGuardProcess()
//     {
//         // 运行守护进程守卫
//         auto pi = CppWinApi::Windows::WinProcess::ForkBackgroundProcess(
//             std::string("launch-daemon-process-guard") + " " + mUUID);

//         int wait = 1000;
//         for (int count = 0; count < 3; ++count)
//         {
//             // 等待启动完成 (1000, 2000, 4000 ms)
//             DWORD waitResult = CppWinApi::Windows::WinProcess::WaitProcessExit(
//                 pi.GetProcessId(), wait);

//             if (waitResult == WAIT_ABANDONED)
//             {
//                 throw std::runtime_error("Guard process terminated unexpectedly");
//             }

//             // 检查守护进程守卫是否已正常运行
//             if (mSharedMemory->Get().GuardProcessIsRunning)
//             {
//                 CppWinApi::Windows::Dialog::Show("start guard-process succeed.");
//                 return pi; // 成功启动，正常返回
//             }

//             wait *= 2; // 指数退避等待
//         }

//         // 三次等待后仍未启动成功
//         throw std::runtime_error("Guard process startup timeout");
//     }

//     /// @brief 保护守护进程守卫
//     std::future<void> ProtectingGuardProcessAsync()
//     {
//         auto self = shared_from_this();
//         return std::async(std::launch::async, [self]()
//                           {
//         do
//         {
//             // 等待进程守卫
//             CppWinApi::Windows::WinProcess::WaitProcessExit(self->mSharedMemory->Get().GuardProcessId);

//             // 设置进程守卫状态
//             self->mSharedMemory->Set([](SharedData* data){data->GuardProcessIsRunning = false;});

//             // 重新启动进程
//             self->LaunchGuardProcess();
//         } while (true); });
//     }
// };
